﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Sistema.Produccion;
using Entidades.Sistema.Venta;
using Mapping.Sistema.Venta;


namespace Mapping.Sistema.Produccion
{
    public static class MappingReceta
    {
        public static List<Receta> ConsultarRecetas()
        {
            try
            {
                SqlCommand cmdInsumos = new SqlCommand();
                cmdInsumos.CommandText = "sp_ConsultarReceta";
                cmdInsumos.CommandType = System.Data.CommandType.StoredProcedure;
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdInsumos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                SqlDataReader drReceta = cmdInsumos.ExecuteReader();

                List<Receta> ColRecetas = new List<Receta>();

                while (drReceta.Read())
                {
                    Receta oReceta = new Receta();
                    oReceta.IdReceta = Convert.ToInt32(drReceta["Id_Receta"]);
                    oReceta.Nombre = drReceta["Nombre"].ToString();
                    oReceta.Estado = drReceta["Estado"].ToString();
                    oReceta.Descripcion = drReceta["Descripcion"].ToString();
                    oReceta.FechaAlta = Convert.ToDateTime(drReceta["FechaAlta"]);
                    oReceta.Predeterminada = Convert.ToBoolean(drReceta["Predeterminada"]);
                    oReceta.Producto.IdProducto = Convert.ToInt32(drReceta["Id_Producto"]);

                    oReceta.Producto = MappingProductos.ConsultarProductoPorClave(oReceta.Producto.IdProducto);

                    SqlCommand cmd2Recetas = new SqlCommand();
                    cmd2Recetas.CommandText = "sp_ConsultarRecetaDetalle";
                    cmd2Recetas.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd2Recetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmd2Recetas.Parameters.Add("@IdReceta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
                    SqlDataReader drDetelleReceta = cmd2Recetas.ExecuteReader();

                    while (drDetelleReceta.Read())
                    {
                        RecetaDetalle oDet = new RecetaDetalle();

                        oDet.Cantidad = Convert.ToDecimal(drDetelleReceta["Cantidad"]);
                        oDet.Insumo.IdInsumo = Convert.ToInt32(drDetelleReceta["Id_Insumo"]);
                        oDet.Insumo = MappingInsumo.ConsultarInsumoPorClave(oDet.Insumo.IdInsumo);
                        oDet.IdRecetaDetalle = oDet.Insumo.IdInsumo;

                        oReceta.AgregarDetalle(oDet);
                    }

                    ColRecetas.Add(oReceta);
                }

                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                return ColRecetas;
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }


        public static Receta ConsultarRecetaPorClave(int IdReceta)
        {
            try
            {
                SqlCommand cmdInsumos = new SqlCommand();
                cmdInsumos.CommandText = "ConsultarRecetaPorClave";
                cmdInsumos.CommandType = System.Data.CommandType.StoredProcedure;
                cmdInsumos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdInsumos.Parameters.Add("@IdReceta", System.Data.SqlDbType.Int).Value = IdReceta;
                SqlDataReader drReceta = cmdInsumos.ExecuteReader();
                

                Receta oReceta = new Receta();

                while (drReceta.Read())
                {
                    oReceta.IdReceta = Convert.ToInt32(drReceta["Id_Receta"]);
                    oReceta.Nombre = drReceta["Nombre"].ToString();
                    oReceta.Estado = drReceta["Estado"].ToString();
                    oReceta.Descripcion = drReceta["Descripcion"].ToString();
                    oReceta.FechaAlta = Convert.ToDateTime(drReceta["FechaAlta"]);
                    oReceta.Predeterminada = Convert.ToBoolean(drReceta["Predeterminada"]);
                    oReceta.Producto.IdProducto = Convert.ToInt32(drReceta["Id_Producto"]);

                    oReceta.Producto = MappingProductos.ConsultarProductoPorClave(oReceta.Producto.IdProducto);

                    SqlCommand cmd2Recetas = new SqlCommand();
                    cmd2Recetas.CommandText = "sp_ConsultarRecetaDetalle";
                    cmd2Recetas.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd2Recetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmd2Recetas.Parameters.Add("@IdReceta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
                    SqlDataReader drDetelleReceta = cmd2Recetas.ExecuteReader();

                    while (drDetelleReceta.Read())
                    {
                        RecetaDetalle oDet = new RecetaDetalle();

                        oDet.Cantidad = Convert.ToDecimal(drDetelleReceta["Cantidad"]);
                        oDet.Insumo.IdInsumo = Convert.ToInt32(drDetelleReceta["Id_Insumo"]);
                        oDet.Insumo = MappingInsumo.ConsultarInsumoPorClave(oDet.Insumo.IdInsumo);
                        oDet.IdRecetaDetalle = oDet.Insumo.IdInsumo;

                        oReceta.AgregarDetalle(oDet);
                    }
                }
                Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
                return oReceta;
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public static Receta ConsultarRecetaPorProducto(int IdProducto)
        {
            try
            {
                SqlCommand cmdInsumos = new SqlCommand();
                cmdInsumos.CommandText = "ConsultarRecetaPorProducto";
                cmdInsumos.CommandType = System.Data.CommandType.StoredProcedure;
                cmdInsumos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();

                cmdInsumos.Parameters.Add("@IdProducto", System.Data.SqlDbType.Int).Value = IdProducto;
                SqlDataReader drReceta = cmdInsumos.ExecuteReader();


                Receta oReceta = new Receta();

                while (drReceta.Read())
                {
                    oReceta.IdReceta = Convert.ToInt32(drReceta["Id_Receta"]);
                    oReceta.Nombre = drReceta["Nombre"].ToString();
                    oReceta.Estado = drReceta["Estado"].ToString();
                    oReceta.Descripcion = drReceta["Descripcion"].ToString();
                    oReceta.FechaAlta = Convert.ToDateTime(drReceta["FechaAlta"]);
                    oReceta.Predeterminada = Convert.ToBoolean(drReceta["Predeterminada"]);
                    oReceta.Producto.IdProducto = Convert.ToInt32(drReceta["Id_Producto"]);

                    //oReceta.Producto = MappingProductos.ConsultarProductoPorClave(oReceta.Producto.IdProducto);

                    SqlCommand cmd2Recetas = new SqlCommand();
                    cmd2Recetas.CommandText = "sp_ConsultarRecetaDetalle";
                    cmd2Recetas.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd2Recetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                    cmd2Recetas.Parameters.Add("@IdReceta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
                    SqlDataReader drDetelleReceta = cmd2Recetas.ExecuteReader();

                    while (drDetelleReceta.Read())
                    {
                        RecetaDetalle oDet = new RecetaDetalle();

                        oDet.Cantidad = Convert.ToDecimal(drDetelleReceta["Cantidad"]);
                        oDet.Insumo.IdInsumo = Convert.ToInt32(drDetelleReceta["Id_Insumo"]);
                        oDet.Insumo = MappingInsumo.ConsultarInsumoPorClave(oDet.Insumo.IdInsumo);
                        oDet.IdRecetaDetalle = oDet.Insumo.IdInsumo;

                        oReceta.AgregarDetalle(oDet);
                    }
                }
                return oReceta;
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        public static int AgregarReceta(Receta oReceta)
        {
            SqlCommand cmdRecetas = new SqlCommand();
            cmdRecetas.CommandText = "sp_AgregarReceta";
            cmdRecetas.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdRecetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetas.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oReceta.Estado.ToString();
            cmdRecetas.Parameters.Add("@Nombre", System.Data.SqlDbType.VarChar).Value = oReceta.Nombre;
            cmdRecetas.Parameters.Add("@Descripcion", System.Data.SqlDbType.VarChar).Value = oReceta.Descripcion;
            cmdRecetas.Parameters.Add("@FechaAlta", System.Data.SqlDbType.Date).Value = oReceta.FechaAlta;
            cmdRecetas.Parameters.Add("@Predeterminada", System.Data.SqlDbType.Bit).Value = oReceta.Predeterminada;
            cmdRecetas.Parameters.Add("@Id_Producto", System.Data.SqlDbType.Int).Value = oReceta.Producto.IdProducto;

            var nro = (decimal)cmdRecetas.ExecuteScalar();
            oReceta.IdReceta = (int)nro;

            foreach (RecetaDetalle det in oReceta.RecetaDetalles)
            {
                AgregarRecetaDetalle(oReceta.IdReceta, det);
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return 0;
        }
        public static bool EliminarReceta(Receta oReceta)
        {

            SqlCommand cmdRecetaDetalle = new SqlCommand();
            cmdRecetaDetalle.CommandText = "sp_EliminarRecetaDetalle";
            cmdRecetaDetalle.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdRecetaDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetaDetalle.Parameters.Add("@Id_Receta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
            cmdRecetaDetalle.ExecuteNonQuery();

            SqlCommand cmdRecetas = new SqlCommand();
            cmdRecetas.CommandText = "sp_EliminarReceta";
            cmdRecetas.CommandType = System.Data.CommandType.StoredProcedure;
            cmdRecetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetas.Parameters.Add("@Id_Receta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
            cmdRecetas.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            return true;
        }
        public static int ModificarReceta(Receta oReceta)
        {
            SqlCommand cmdRecetas = new SqlCommand();
            cmdRecetas.CommandText = "sp_ModificarReceta";
            cmdRecetas.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdRecetas.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetas.Parameters.Add("@Id_Receta", System.Data.SqlDbType.Int).Value = oReceta.IdReceta;
            cmdRecetas.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oReceta.Estado.ToString();
            cmdRecetas.Parameters.Add("@Nombre", System.Data.SqlDbType.VarChar).Value = oReceta.Nombre;
            cmdRecetas.Parameters.Add("@Descripcion", System.Data.SqlDbType.VarChar).Value = oReceta.Descripcion;
            cmdRecetas.Parameters.Add("@FechaAlta", System.Data.SqlDbType.Date).Value = oReceta.FechaAlta;
            cmdRecetas.Parameters.Add("@Predeterminada", System.Data.SqlDbType.Bit).Value = oReceta.Predeterminada;
            cmdRecetas.Parameters.Add("@Id_Producto", System.Data.SqlDbType.Int).Value = oReceta.Producto.IdProducto;

            int nro = Convert.ToInt32(cmdRecetas.ExecuteScalar());

            EliminarRecetaDetalle(oReceta.IdReceta);

            foreach (RecetaDetalle det in oReceta.RecetaDetalles)
            {
                AgregarRecetaDetalle(oReceta.IdReceta, det);
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return nro;
        }

        //Detalle
        public static bool AgregarRecetaDetalle(int IdReceta, RecetaDetalle oRecetaDetalle)
        {

            SqlCommand cmdRecetaDetalle = new SqlCommand();
            cmdRecetaDetalle.CommandText = "sp_AgregarRecetaDetalle";
            cmdRecetaDetalle.CommandType = System.Data.CommandType.StoredProcedure;
            cmdRecetaDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetaDetalle.Parameters.Add("@Id_Receta", System.Data.SqlDbType.Int).Value = IdReceta;
            cmdRecetaDetalle.Parameters.Add("@Id_Insumo", System.Data.SqlDbType.Int).Value = oRecetaDetalle.Insumo.IdInsumo;
            cmdRecetaDetalle.Parameters.Add("@Cantidad", System.Data.SqlDbType.Decimal).Value = oRecetaDetalle.Cantidad;
            cmdRecetaDetalle.ExecuteNonQuery();

            return true;
        }
        public static bool EliminarRecetaDetalle(int IdReceta)
        {
            SqlCommand cmdRecetaDetalle = new SqlCommand();
            cmdRecetaDetalle.CommandText = "sp_EliminarRecetaDetalle";
            cmdRecetaDetalle.CommandType = System.Data.CommandType.StoredProcedure;

            cmdRecetaDetalle.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdRecetaDetalle.Parameters.Add("@Id_Receta", System.Data.SqlDbType.Int).Value = IdReceta;
            cmdRecetaDetalle.ExecuteNonQuery();

            return true;
        }      
    }
}
